package com.caird.pmp.iot.message;

import io.netty.buffer.ByteBuf;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class MessageUtils {

    public static byte[] encodeBCD(String src) {

        if (null == src || 0 == src.length())
            return null;

        byte[] dst = new byte[src.length()/2];

        for (int i=0; i<dst.length; i++)
        {
            dst[i] = (byte)(((src.charAt(2*i)-'0')<<4) | (src.charAt(2*i+1)-'0'));
        }

        return dst;
    }

    public static String decodeBCD(byte[] src) {
        byte[] dst = new byte[12];

        for (int i=0; i<src.length; i++)
        {
            dst[2*i]   = (byte)('0' + ((src[i]>>4) & 0x0F));
            dst[2*i+1] = (byte)('0' + ((src[i]   ) & 0x0F));
        }

        return new String(dst);
    }

    /**
     * 部标日期解码
     */
    public static Date decodeDate(byte[] bs)  {
        if (null != bs && 6 == bs.length) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
            try {
                return sdf.parse(decodeBCD(bs));
            } catch (ParseException e) {
                return null;
            }
        } else
            return null;
    }

    /**
     * 部标日期编码
     */
    public static byte[] encodeDate(Date date)  {
        if (null == date)
            return null;
        else {
            SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
            return encodeBCD(sdf.format(date));
        }
    }



//    public static String dateToStamp(String s) throws ParseException{
//        String res;
//        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        Date date = simpleDateFormat.parse(s);
//        long ts = date.getTime();
//        res = String.valueOf(ts);
//        return res;
//    }
//
//    public static Date BCDToDate(BCD time) throws ParseException {
//        String strTime = time.toHexString().replace("0x", "");
//        SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmssSSSS");
//        return sdf.parse(strTime);
//    }
//
//    public static Date BCD6ToDate(BCD time) throws ParseException {
//        String strTime = time.toHexString();
//        return new SimpleDateFormat("yyMMddHHmmss").parse(strTime);
//    }


    /**
     * 异或校验
     * [begPos, endPos)，包含begPos，不包含endPos，相对buffer首地址
     */
    public static Byte xor(ByteBuf buf, int begPos, int endPos) {

        if (null == buf || begPos >= endPos || endPos > buf.capacity())
            return null;

        byte code = 0;

        for (int i=begPos; i<endPos; i++) {
            code ^= buf.getUnsignedByte(i);
        }

        return (Byte)code;
    }
}
